package main

import "fmt"

/*
两数之和
给定一个整数数组 nums和一个整数目标值 target，请你在该数组中找出 和为目标值 target 的那两个整数，并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是，数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
。*/

//两个for循环
//func twoSum(nums []int, target int) []int {
//	var sum []int
//	for i:=0;i<len(nums);i++{
//		for j:=i+1;j<len(nums);j++{
//			if target == nums[i]+nums[j]{
//				sum=append(sum,i,j)
//			}
//		}
//	}
//	return sum
//}

//二分法 只能针对已排序数组
//固定一个值i，对另一个值mid进行二分搜索
//func twoSum(nums []int, target int) []int{
//	var (
//		i,mid int
//		sum []int
//	)
//	for i=0;i<len(nums);i++{
//		var (
//			left = i+1
//			right = len(nums)-1
//		)
//		for left<=right{
//			mid=(left+right)/2
//			if nums[mid] == target-nums[i]{
//				sum=append(sum,i,mid)
//				break
//			}else if nums[mid]>target-nums[i]{
//				right = mid - 1
//			}else if nums[mid]<target-nums[i]{
//				left = mid + 1
//			}
//		}
//	}
//	return sum
//}

//哈希表
/*
func twoSum(nums []int, target int) []int {
	res:=map[int]int{}//map的k,v为  map[数组的值]数组的序号
	for i,x := range nums{//i为数组num的序号 x为数组的值
		if p,ok := res[target - x];ok{
			return []int{p,i}
		}
		res[x] = i
	}
	return nil
}
*/

//双指针 只能针对已排序数组
func twoSum(nums []int, target int) []int {
	left, right := 0, len(nums)-1
	for left < right {
		if target == nums[left]+nums[right] {
			break
		} else if target > nums[left]+nums[right] {
			left++
		} else if target < nums[left]+nums[right] {
			right--
		}
	}
	return []int{left, right}
}

func main() {
	nums := []int{1, 2, 4, 6, 8, 9, 11}
	n := 11
	fmt.Println(twoSum(nums, n))
}
